package Jihe;
/*Collection接口：用于存储单个对象的集合
* 在java集合里如何判断两个对象是否相等的规则是：
*(1)先判断两个对象的hashcode是否相等
* 如果不相等，则两个对象也不想等，结束
* 如果相等，则转入（2）
*（2）比较两个对象的equals是否相等，
* 如果不等，则不等，如果相等，则相等。
* （equals（）是判断两个对象是否相等的关键）
* */
import com.sun.prism.impl.shape.BasicRoundRectRep;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;

public class ListDemo {
    public static void main(String[] args) {
//        arrayList();
//        vector();
        linkedList();
    }
    /*
    *LinkedList
    * 1.实现原理，采用双向链表结构实现
    * 2.适合插入和删除操作，性能高
    * 3.允许有重复元素，有序性的
    * 4.允许多个null元素
    * --------------------------
    * List接口：
    * 3.具体的实现有常用的：ArrayList，Vector，LinkedList
    * 在实际开发中，我们如何选择list的具体实现
    * 1.安全性问题  （用工具类把ArrayList变成安全的）
    * 2.是否频繁插入，删除操作（LinkedList）
    * 3.是否是存储后遍历（ArrayList）
    * 面试题：实现ArrayList？
    * 采用动态数组
    * */
    private static void linkedList(){
        LinkedList<String> linkedList = new LinkedList<>();
        linkedList.add("苍老师");
        linkedList.add("汪老师");
        linkedList.add("夫老师");
        linkedList.add("杨老师");
        linkedList.add("周老师");
        int size = linkedList.size();
        for(int i=0;i<size;i++){
            System.out.println(linkedList.get(i));
        }
    }
    /*
    * Vector
    * 1.实现原理，采用动态对象数组实现，默认构造方法是创建一个大小为10的对象数组
    * 2.扩充的算法：当没有定义增量，增量自动定义为0，扩充为原来大小的两倍，
    * 当自己定义了增量，那么就扩充为原来的数组大小+自己定义的增量大小
    * 3.不适合删除和插入操作
    * 4.为了防止数组扩充次数的过多，我们建议创建Vector时，给定一个初始容量
    * 5.线程安全的，适合在多线程访问时使用，在效率上低于单线程
    * 面试题：Vector和ArrayList区别？
    *
    * */
    private static void vector(){
        Vector<String> vector = new Vector<>();
        vector.add("苍老师");
        vector.add("李老师");
        vector.add("王老师");
        vector.add("毕老师");
        int size = vector.size();
        for(int i=0;i<size;i++){
            System.out.println(vector.get(i));
        }
    }
      /*
      *  ArrayList
      * 1.实现原理，采用动态对象数组实现，默认构造方法创建一个空数组
      * 2.第一次添加元素后，扩充容量为10，之后的扩充算法：老数组大小+老数组大小的一半
      * 3.不适合进行删除或插入操作
      * 4.为了防止数组扩充次数的过多，我们建议创建ArrayList时，给定一个初始容量
      * 5.线程不安全，适合在单线程访问时使用 JDK1.2开始引入
      *
      * */

    private static void arrayList(){
        //使用集合来存储多个不同类型的元素（对象），那么在处理时会比较麻烦，在实际开发中，不建议
        //这样使用，我们应该在一个集合中存储相同类型的对象

        List<String> list = new ArrayList<>(10);//10 给定一个初始容量
        list.add("苍老师");
        list.add("李老师");
        list.add("张老师");
        list.add("毕老师");

//        list.add(10);
        int size = list.size(); //遍历的时候建议用局部变量接收list.size()方法
        //原因是局部变量是存储在栈内存中，性能高。前提是list长度不变，对象也不变
        for(int i=0;i<size;i++){
            System.out.println(list.get(i));
        }
        System.out.println(list.contains("苍老师"));
        list.remove("毕老师");
        list.set(0,"王老师");
        System.out.println(
                list.get(0)
        );
//        list.set(0,10);
       String[] strings = list.toArray(new String[]{});
       for(String s: strings){
           System.out.println(s.toString());
       }

    }

}
